﻿//2779. 数组的最大美丽值
//给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。
//在一步操作中，你可以执行下述指令：
//在范围[0, nums.length - 1] 中选择一个 此前没有选过 的下标 i 。
//将 nums[i] 替换为范围[nums[i] - k, nums[i] + k] 内的任一整数。
//数组的 美丽值 定义为数组中由相等元素组成的最长子序列的长度。
//对数组 nums 执行上述操作任意次后，返回数组可能取得的 最大 美丽值。
//注意：你 只 能对每个下标执行 一次 此操作。
//数组的 子序列 定义是：经由原数组删除一些元素（也可能不删除）得到的一个新数组，且在此过程中剩余元素的顺序不发生改变。



//方法一 滑动窗口

class Solution {
public:
    int maximumBeauty(vector<int>& nums, int k)
    {
        sort(nums.begin(), nums.end());
        int ret = 0, begin = 0, end = -1;
        for (end = 0; end < nums.size(); end++)
        {
            while (nums[end] > nums[begin] + 2 * k)
            {
                begin++;
            }
            ret = max(ret, end - begin + 1);
        }
        return ret;
    }
};


//方法二 差分数组


class Solution {
public:
    int maximumBeauty(vector<int>& nums, int k)
    {
        int m = *max_element(nums.begin(), nums.end());
        vector<int> diff(m + 2, 0);

        for (auto& e : nums)
        {
            diff[max(e - k, 0)]++;
            diff[min(e + k + 1, m + 1)]--;
        }

        int ret = 0, sum = 0;
        for (auto e : diff)
        {
            sum += e;
            ret = max(ret, sum);
        }
        return ret;
    }
};